package models

import "time"

type Channel string

const (
	ChannelEmail    Channel = "email"
	ChannelSlack    Channel = "slack"
	ChannelDingTalk Channel = "dingtalk"
	ChannelWebhook  Channel = "webhook"
)

type Priority string

const (
	PriorityLow      Priority = "low"
	PriorityMedium   Priority = "medium"
	PriorityHigh     Priority = "high"
	PriorityCritical Priority = "critical"
)

type Status string

const (
	StatusPending  Status = "pending"
	StatusSent     Status = "sent"
	StatusFailed   Status = "failed"
	StatusRetrying Status = "retrying"
)

type Notification struct {
	ID           string            `bson:"_id,omitempty" json:"id"`
	Channel      Channel           `bson:"channel" json:"channel"`
	Recipients   []string          `bson:"recipients" json:"recipients"`
	Subject      string            `bson:"subject" json:"subject"`
	Body         string            `bson:"body" json:"body"`
	Priority     Priority          `bson:"priority" json:"priority"`
	Status       Status            `bson:"status" json:"status"`
	Source       string            `bson:"source" json:"source"`           // "alert", "ticket", "system"
	SourceID     string            `bson:"sourceId" json:"sourceId"`       // alert_id, ticket_id, etc.
	TemplateID   string            `bson:"templateId,omitempty" json:"templateId,omitempty"`
	TemplateData map[string]string `bson:"templateData,omitempty" json:"templateData,omitempty"`
	ErrorMessage string            `bson:"errorMessage,omitempty" json:"errorMessage,omitempty"`
	RetryCount   int               `bson:"retryCount" json:"retryCount"`
	CreatedAt    time.Time         `bson:"createdAt" json:"createdAt"`
	SentAt       *time.Time        `bson:"sentAt,omitempty" json:"sentAt,omitempty"`
}

type UserPreferences struct {
	UserID             string            `bson:"userId" json:"userId"`
	EmailEnabled       bool              `bson:"emailEnabled" json:"emailEnabled"`
	SlackEnabled       bool              `bson:"slackEnabled" json:"slackEnabled"`
	DingTalkEnabled    bool              `bson:"dingTalkEnabled" json:"dingTalkEnabled"`
	SilentHours        []string          `bson:"silentHours,omitempty" json:"silentHours,omitempty"`
	EventSubscriptions map[string]bool   `bson:"eventSubscriptions" json:"eventSubscriptions"`
	UpdatedAt          time.Time         `bson:"updatedAt" json:"updatedAt"`
}
